In [1]:
%pip install -r requirements.txt
Requirement already satisfied: scipy in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 1)) (1.5.2)
Requirement already satisfied: wavfile in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 2)) (4.4.0)
Requirement already satisfied: rir-generator in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 3)) (0.2.0)
Requirement already satisfied: bitstring in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 4)) (3.1.9)
Requirement already satisfied: numpy>=1.14.5 in c:\users\stast\anaconda3\lib\site-packages (from scipy->-r requirements.txt (line 1)) (1.19.2)
Requirement already satisfied: cffi>=1.1.0 in c:\users\stast\anaconda3\lib\site-packages (from rir-generator->-r requirements.txt (line 3)) (1.14.3)
Requirement already satisfied: pycparser in c:\users\stast\anaconda3\lib\site-packages (from cffi>=1.1.0->rir-generator->-r requirements.txt (line 3)) (2.20)
Note: you may need to restart the kernel to use updated packages.
In [2]:
import IPython
import soundfile as sf
import numpy as np
import matplotlib.pyplot as plt
import scipy
import sys

from huffman_encoding import HuffmanEncoder
In [11]:
signal, fs = sf.read("guitar_sample.wav", always_2d=True)
In [4]:
byte_representation = signal.tobytes()
In [5]:
huffman_encoder = HuffmanEncoder()
huffman_encoder.initialize(byte_representation)
In [6]:
encoded_signal = huffman_encoder.encode(byte_representation)
In [7]:
print(f"""Theoretical entropy: {huffman_encoder.get_entropy(): .3f}
Bits per byte in encoding: {len(encoded_signal) / len(byte_representation) : .3f}
Compression ratio: {len(encoded_signal) / len(byte_representation) / 8 : .3f}""")
Theoretical entropy:  4.127
Bits per byte in encoding:  4.140
Compression ratio:  0.517
In [8]:
decoded_signal_bytes = huffman_encoder.decode(encoded_signal)
In [18]:
restored_signal = np.frombuffer(decoded_signal_bytes)
restored_signal = np.reshape(restored_signal, newshape=(restored_signal.shape[0] // 2, 2))
In [20]:
assert np.array_equal(signal, restored_signal)
In [19]:
IPython.display.Audio(restored_signal.T, rate=fs, autoplay=True)
Out[19]:
Your browser does not support the audio element.
In [15]:
IPython.display.Audio(signal.T, rate=fs, autoplay=True)
Out[15]:
Your browser does not support the audio element.